home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Arashi 1.1.1 / source code / For your think c folder / VA Kit ƒ / VA14Segment.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-09  |  7.0 KB  |  357 lines  |  [TEXT/KAHL]

  1. /*/
  2.      Project Arashi: VA14Segment.c
  3.      Major release: Version 1.1d2, 9/5/95
  4.  
  5.      Last modification: Wednesday, September 9, 1992, 21:40
  6.      Created: Friday, March 24, 1989, 15:07
  7.  
  8.      Copyright © 1989-1992, Juri Munkki
  9. /*/
  10.  
  11. /*
  12. **    We needed some text effects for project STORM, so the
  13. **    easiest way to create a quick and dirty font was to
  14. **    simulate the same type of LED display that is used
  15. **    by most pinballs today. Only uppercase characters
  16. **    are defined. The text routines should be pretty fast
  17. **    though, so you can create some interesting animations
  18. **    with them. Double buffering is not currently supported
  19. **    and all 8 pixel bits are written. A masking version
  20. **    of these routines should be easy enough to write.
  21. */
  22.  
  23. #include "VA.h"
  24. #include "VAInternal.h"
  25.  
  26. #define    N(a)    (1<<a)
  27.  
  28. int        Characters[]=        /*    Each bit represents a segment:    */
  29.         {    0,                                /* space*/
  30.             N(7)+N(11),
  31.             +N(6)+N(8),
  32.             -1,
  33.             1+2+8+16+N(5)+N(9)+N(7)+N(11),    /*    $    */
  34.             +N(12)+N(8)+16+2,
  35.             0,
  36.             +N(7),
  37.             +N(8)+N(10),                    /*    (    */
  38.             N(6)+N(12),                        /*    )    */
  39.             +N(5)+N(6)+N(7)+N(8)+N(9)+N(10)+N(11)+N(12),
  40.                                             /*    *    */
  41.             N(5)+N(7)+N(9)+N(11),            /*    +    */
  42.             N(12),                            /*    ,    */
  43.             N(5)+N(9),                        /*    -    */
  44.             N(11),                            /*    .    */
  45.             N(12)+N(8),                        /*    /    */
  46.             1+2+4+8+16+N(8)+N(12)+N(13),    /*    0    */
  47.             N(7)+N(11),                        /*    1    */
  48.             1+4+8+N(9)+N(12),                /*    2    */
  49.             1+2+4+8+N(9),                    /*    3    */
  50.             2+4+16+N(5)+N(9),                /*    4    */
  51.             8+64+N(9)+2+1,                    /*    5    */
  52.             1+2+8+16+32+N(9)+N(13),            /*    6    */
  53.             N(12)+N(8)+8,                    /*    7    */
  54.             1+2+4+8+16+32+N(9)+N(13),        /*    8    */
  55.             1+2+4+8+16+N(5)+N(9),            /*    9    */
  56.             0,                                /*    :    */
  57.             0,                                /*    ;    */
  58.             1+N(12),                        /*    <    */
  59.             1+32+N(9),                        /*    =    */
  60.             1+N(10),                        /*    >    */
  61.             4+8+16+N(9)+N(11),                /*    ?    */
  62.             1+4+8+16+N(13)+N(9)+N(7),        /*    @    */
  63.             2+4+8+16+32+N(9)+N(13),            /*    A    */
  64.             1+2+4+8+N(7)+N(9)+N(11),        /*    B    */
  65.             1+8+16+N(13),                    /*    C    */
  66.             1+2+4+8+N(7)+N(11),                /*    D    */
  67.             1+8+16+N(5)+N(9)+N(13),            /*    E    */
  68.             8+16+N(5)+N(9)+N(13),            /*    F    */
  69.             1+2+8+16+N(9)+N(13),            /*    G    */
  70.             2+4+16+N(5)+N(9)+N(13),            /*    H    */
  71.             1+8+N(7)+N(11),                    /*    I    */
  72.             1+2+4+N(13),                    /*    J    */
  73.             16+N(13)+N(5)+N(8)+N(10),        /*    K    */
  74.             1+16+N(13),                        /*    L    */
  75.             2+4+16+N(13)+N(6)+N(8),            /*    M    */
  76.             2+4+16+N(13)+N(6)+N(10),        /*    N    */
  77.             1+2+4+8+16+N(13),                /*    O    */
  78.             4+8+16+N(13)+N(5)+N(9),            /*    P    */
  79.             1+2+4+8+16+N(13)+N(10),            /*    Q    */
  80.             4+8+16+N(13)+N(5)+N(9)+N(10),    /*    R    */
  81.             1+2+8+16+N(5)+N(9),                /*    S    */
  82.             8+N(11)+N(7),                    /*    T    */
  83.             1+2+4+16+N(13),                    /*    U    */
  84.             16+N(13)+N(12)+N(8),            /*    V    */
  85.             2+4+16+N(13)+N(12)+N(10),        /*    W    */
  86.             N(12)+N(8)+N(6)+N(10),            /*    X    */
  87.             N(6)+N(8)+N(11),                /*    Y    */
  88.             1+8+N(8)+N(12),                    /*    Z    */
  89.             1+8+16+N(13),                    /*    [    */
  90.             N(6)+N(10),                        /*    \    */
  91.             1+2+4+8,                        /*    ]    */
  92.             N(12)+N(10),                    /*    ^    */
  93.             1,                                /*    _    */
  94.             8+N(6)+N(8)+N(12)+N(10),        /*    Ω    */
  95.             0
  96.         };
  97.  
  98. void    VADraw14Segments(x,y,code)
  99. int        x,y,code;
  100. {
  101.     asm    {    
  102.             move.l    D3,-(SP)
  103.             move.l    A2,-(SP)
  104.             move.w    code,D3
  105.             move.l    VA.base,A0
  106.             move.w    y,D0
  107.             move.w    VA.row,D1
  108.             mulu.w    D1,D0
  109.             add.l    D0,A0
  110.             add.w    x,A0
  111.             
  112.             move.l    A0,A2
  113.             addq.l    #1,A0            ;    Move right
  114.             
  115.             moveq.l    #-1,D0            ;    Erase, if no segment
  116.             move.w    VA.segmscale,D2    ;    Load segment scale
  117.             add.w    D2,D2
  118.             ror.w    #1,D3            ;    Shift code bit out
  119.             bcc.s    @seg0            ;    Visible segment?
  120.             move.w    VA.color,D0        ;    Yes.
  121.     @seg0
  122.             move.b    D0,(A0)+        ;    Draw, move right
  123.             dbra    D2,@seg0        ;    Until done
  124.             
  125.             sub.w    D1,A0            ;    Move up
  126.  
  127.             moveq.l    #-1,D0            ;    Erase, if no segment
  128.             move.w    VA.segmscale,D2    ;    As above...
  129.             add.w    D2,D2
  130.             ror.w    #1,D3
  131.             bcc.s    @seg1
  132.             move.w    VA.color,D0
  133.     @seg1
  134.             move.b    D0,(A0)
  135.             sub.w    D1,A0
  136.             dbra    D2,@seg1
  137.             
  138.             sub.w    D1,A0
  139.  
  140.             moveq.l    #-1,D0
  141.             move.w    VA.segmscale,D2
  142.             add.w    D2,D2
  143.             ror.w    #1,D3
  144.             bcc.s    @seg2
  145.             move.w    VA.color,D0
  146.     @seg2
  147.             move.b    D0,(A0)
  148.             sub.w    D1,A0
  149.             dbra    D2,@seg2
  150.             
  151.             moveq.l    #-1,D0
  152.             move.w    VA.segmscale,D2
  153.             add.w    D2,D2
  154.             ror.w    #1,D3
  155.             bcc.s    @seg3
  156.             move.w    VA.color,D0
  157.     @seg3
  158.             move.b    D0,-(A0)
  159.             dbra    D2,@seg3
  160.             
  161.             subq.l    #1,A0
  162.  
  163.             moveq.l    #-1,D0
  164.             move.w    VA.segmscale,D2
  165.             add.w    D2,D2
  166.             ror.w    #1,D3
  167.             bcc.s    @seg4
  168.             move.w    VA.color,D0
  169.     @seg4
  170.             add.w    D1,A0
  171.             move.b    D0,(A0)
  172.             dbra    D2,@seg4
  173.  
  174.             addq.l    #1,A0
  175.             add.w    D1,A0
  176.             moveq.l    #-1,D0
  177.             move.w    VA.segmscale,D2
  178.             subq.l    #1,D2
  179.             ror.w    #1,D3
  180.             bcc.s    @seg5
  181.             move.w    VA.color,D0
  182.     @seg5
  183.             move.b    D0,(A0)+
  184.             dbra    D2,@seg5
  185.             
  186.             move.l    A0,A1            ;    Center. Store in A1
  187.  
  188.             moveq.l    #-1,D0
  189.             move.w    VA.segmscale,D2
  190.             subq.l    #1,D2
  191.             ror.w    #1,D3
  192.             bcc.s    @seg6
  193.             move.w    VA.color,D0
  194.     @seg6
  195.             sub.w    D1,A0
  196.             move.b    D0,-(A0)
  197.             sub.w    D1,A0
  198.             move.b    D0,(A0)
  199.             dbra    D2,@seg6
  200.             
  201.             move.l    A1,A0
  202.  
  203.             moveq.l    #-1,D0
  204.             move.w    VA.segmscale,D2
  205.             add.w    D2,D2
  206.             ror.w    #1,D3
  207.             bcc.s    @seg7
  208.             move.w    VA.color,D0
  209.     @seg7
  210.             sub.w    D1,A0
  211.             move.b    D0,(A0)
  212.             dbra    D2,@seg7
  213.             
  214.             move.l    A1,A0
  215.  
  216.             addq.l    #1,A0
  217.             moveq.l    #-1,D0
  218.             move.w    VA.segmscale,D2
  219.             subq.l    #1,D2
  220.             ror.w    #1,D3
  221.             bcc.s    @seg8
  222.             move.w    VA.color,D0
  223.     @seg8
  224.             sub.w    D1,A0
  225.             move.b    D0,(A0)
  226.             sub.w    D1,A0
  227.             move.b    D0,(A0)+
  228.             dbra    D2,@seg8
  229.     
  230.             move.l    A1,A0
  231.  
  232.             addq.l    #1,A0
  233.             moveq.l    #-1,D0
  234.             move.w    VA.segmscale,D2
  235.             subq.l    #1,D2
  236.             ror.w    #1,D3
  237.             bcc.s    @seg9
  238.             move.w    VA.color,D0
  239.     @seg9
  240.             move.b    D0,(A0)+
  241.             dbra    D2,@seg9
  242.             
  243.             move.l    A1,A0
  244.  
  245.             addq.l    #1,A0
  246.             moveq.l    #-1,D0
  247.             move.w    VA.segmscale,D2
  248.             subq.l    #1,D2
  249.             ror.w    #1,D3
  250.             bcc.s    @segA
  251.             move.w    VA.color,D0
  252.     @segA
  253.             add.w    D1,A0
  254.             move.b    D0,(A0)
  255.             add.w    D1,A0
  256.             move.b    D0,(A0)+
  257.             dbra    D2,@segA
  258.  
  259.             move.l    A1,A0
  260.  
  261.             moveq.l    #-1,D0
  262.             move.w    VA.segmscale,D2
  263.             add.w    D2,D2
  264.             ror.w    #1,D3
  265.             bcc.s    @segB
  266.             move.w    VA.color,D0
  267.     @segB
  268.             add.w    D1,A0
  269.             move.b    D0,(A0)
  270.             dbra    D2,@segB
  271.             
  272.             move.l    A1,A0
  273.  
  274.             moveq.l    #-1,D0
  275.             move.w    VA.segmscale,D2
  276.             subq.l    #1,D2
  277.             ror.w    #1,D3
  278.             bcc.s    @segC
  279.             move.w    VA.color,D0
  280.     @segC
  281.             add.w    D1,A0
  282.             move.b    D0,-(A0)
  283.             add.w    D1,A0
  284.             move.b    D0,(A0)
  285.             dbra    D2,@segC
  286.  
  287.             move.l    A2,A0
  288.             moveq.l    #-1,D0            ;    Erase, if no segment
  289.             move.w    VA.segmscale,D2    ;    As above...
  290.             add.w    D2,D2
  291.             ror.w    #1,D3
  292.             bcc.s    @segD
  293.             move.w    VA.color,D0
  294.     @segD
  295.             sub.w    D1,A0
  296.             move.b    D0,(A0)
  297.             dbra    D2,@segD
  298.  
  299.             move.l    (sp)+,A2
  300.             move.l    (sp)+,D3
  301.         }
  302. }
  303.  
  304. /*
  305. **    VA14Seg draws a shape with the 14 segment system.
  306. */
  307. void    VA14Seg(num,x,y)
  308. int        num;
  309. int        x,y;
  310. {
  311.     register    int        dig,neg;
  312.                 int        mode;
  313.  
  314.     mode=QD32COMPATIBLE;
  315.     SwapMMUMode(&mode);
  316.  
  317.     VADraw14Segments(x,y,Characters[num]);
  318.     SwapMMUMode(&mode);
  319. }
  320.  
  321. /*
  322. **    VADrawText is similar to the QuickDraw DrawText,
  323. **    but you use VAMoveTo to specify the location.
  324. */
  325. void    VADrawText(p,a,b)
  326. register    char    *p;
  327. register    long    a,b;
  328. {
  329.     register    unsigned    char    thechar;
  330.     register                int        step;
  331.                             int        mode;
  332.  
  333.     p = (char *) StripAddress((void *) p);
  334.     mode=QD32COMPATIBLE;
  335.     SwapMMUMode(&mode);
  336.  
  337.     p+=a;
  338.     b+=a;
  339.     if(VA.CurrentX>=0
  340.         && VA.CurrentY>=(VA.segmscale*4+4)
  341.         && VA.CurrentY<VA.frame.bottom)
  342.     {    step= VA.segmscale*3+3;
  343.         while(a++<b)
  344.         {    if(VA.CurrentX<VA.frame.right-step)
  345.             {    thechar= *p++ - 32;
  346.                 if(thechar>=64) thechar-=32;
  347.                 if(thechar>64) thechar=64;
  348.                 VADraw14Segments(VA.CurrentX,VA.CurrentY,Characters[thechar]);
  349.                 VA.CurrentX+=step;
  350.             }
  351.             else
  352.             {    a=b;
  353.             }
  354.         }
  355.     }
  356.     SwapMMUMode(&mode);
  357. }